package utils

import (
	"crypto/rand"
	"encoding/base64"
	"log"
	"os"

	beego "github.com/beego/beego/v2/server/web"
)

// Config 配置结构体
type Config struct {
	JWTSecret         string
	JWTExpire         int
	PasswordSalt      string
	UploadDir         string
	RedisHost         string
	RedisPort         int
	RedisPswd         string
	RedisDB           int
	EnableLogging     bool
	LogLevel          string
	LogPath           string
	RateLimitEnabled  bool
	RateLimitRequests int
	RateLimitWindow   int
}

var AppConfig *Config

// InitConfig 初始化配置
func InitConfig() error {
	var err error
	AppConfig = &Config{}

	// JWT配置
	AppConfig.JWTSecret, err = beego.AppConfig.String("jwtSecret")
	if err != nil || AppConfig.JWTSecret == "" {
		log.Println("警告: JWT密钥未配置或为空，使用随机生成的密钥")
		AppConfig.JWTSecret = generateRandomKey()
	}

	AppConfig.JWTExpire, err = beego.AppConfig.Int("jwtExpire")
	if err != nil {
		AppConfig.JWTExpire = 86400 // 默认24小时
	}

	// 密码盐配置
	AppConfig.PasswordSalt, err = beego.AppConfig.String("passwordSalt")
	if err != nil || AppConfig.PasswordSalt == "" {
		log.Println("警告: 密码盐未配置，使用默认值")
		AppConfig.PasswordSalt = "defaultSalt"
	}

	// 文件上传配置
	AppConfig.UploadDir, err = beego.AppConfig.String("uploadDir")
	if err != nil {
		AppConfig.UploadDir = "./upload/"
	}

	// Redis配置
	AppConfig.RedisHost, err = beego.AppConfig.String("redisHost")
	if err != nil {
		AppConfig.RedisHost = "127.0.0.1"
	}

	AppConfig.RedisPort, err = beego.AppConfig.Int("redisPort")
	if err != nil {
		AppConfig.RedisPort = 6379
	}

	AppConfig.RedisPswd, _ = beego.AppConfig.String("redisPswd")
	AppConfig.RedisDB, err = beego.AppConfig.Int("redisDB")
	if err != nil {
		AppConfig.RedisDB = 0
	}

	// 日志配置
	AppConfig.EnableLogging, err = beego.AppConfig.Bool("enableLogging")
	if err != nil {
		AppConfig.EnableLogging = true
	}

	AppConfig.LogLevel, err = beego.AppConfig.String("logLevel")
	if err != nil {
		AppConfig.LogLevel = "info"
	}

	AppConfig.LogPath, err = beego.AppConfig.String("logPath")
	if err != nil {
		AppConfig.LogPath = "./logs/"
	}

	// 限流配置
	AppConfig.RateLimitEnabled, err = beego.AppConfig.Bool("rateLimitEnabled")
	if err != nil {
		AppConfig.RateLimitEnabled = false
	}

	AppConfig.RateLimitRequests, err = beego.AppConfig.Int("rateLimitRequests")
	if err != nil {
		AppConfig.RateLimitRequests = 100
	}

	AppConfig.RateLimitWindow, err = beego.AppConfig.Int("rateLimitWindow")
	if err != nil {
		AppConfig.RateLimitWindow = 60
	}

	// 创建必要的目录
	createDirIfNotExists(AppConfig.UploadDir)
	createDirIfNotExists(AppConfig.LogPath)

	return nil
}

// generateRandomKey 生成随机密钥
func generateRandomKey() string {
	bytes := make([]byte, 32)
	if _, err := rand.Read(bytes); err != nil {
		log.Fatal("无法生成随机密钥:", err)
	}
	return base64.URLEncoding.EncodeToString(bytes)
}

// createDirIfNotExists 创建目录如果不存在
func createDirIfNotExists(dir string) {
	if _, err := os.Stat(dir); os.IsNotExist(err) {
		if err := os.MkdirAll(dir, 0755); err != nil {
			log.Printf("创建目录 %s 失败: %v", dir, err)
		}
	}
}

// GetJWTSecret 获取JWT密钥
func GetJWTSecret() string {
	if AppConfig == nil {
		log.Fatal("配置未初始化")
	}
	return AppConfig.JWTSecret
}

// GetJWTExpire 获取JWT过期时间
func GetJWTExpire() int {
	if AppConfig == nil {
		log.Fatal("配置未初始化")
	}
	return AppConfig.JWTExpire
}

// GetPasswordSalt 获取密码盐
func GetPasswordSalt() string {
	if AppConfig == nil {
		log.Fatal("配置未初始化")
	}
	return AppConfig.PasswordSalt
}
